package com.seaengine.util
{
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.display.Stage;
	import flash.geom.Point;
	import flash.geom.Rectangle;

	/**
	 * 图形几何工具
	 * @author 曹鹏
	 */
	public final class GeomUtil
	{
		public function GeomUtil()
		{
			throw new Error("Can not be instantiated!");
		}
		
		/**
		 * 转换源对象坐标到目标对象 
		 * @param pos		坐标点
		 * @param source	源对象
		 * @param target	目标对象
		 * @return 转换后的坐标点
		 * 
		 */		
		public static function localToContent(pos:Point,source:DisplayObject,target:DisplayObject):Point
		{
			if (target && source)
				return target.globalToLocal(source.localToGlobal(pos));
			else if (source)
				return source.localToGlobal(pos);
			else if (target)
				return target.globalToLocal(pos);
			return null;
		}
		
		/**
		 * 转换源对象矩形坐标到目标对象 
		 * @param rect		矩形
		 * @param source	源对象
		 * @param target	目标对象
		 * @return 转换后的矩形
		 * 
		 */		
		public static function localRectToContent(rect:Rectangle,source:DisplayObject,target:DisplayObject):Rectangle
		{
			if (source == target)
				return rect;
			
			var topLeft:Point = localToContent(rect.topLeft,source,target);
			var bottomRight:Point = localToContent(rect.bottomRight,source,target);
			return new Rectangle(topLeft.x,topLeft.y,bottomRight.x - topLeft.x,bottomRight.y - topLeft.y);
		}
		
		/**
		 * 获取以父对象为基准的矩形
		 * 若给定对象为Stage，返回的是舞台矩形 
		 * @param obj	显示对象或者矩形
		 * @param space	当前坐标系，默认值为父显示对象
		 * @return 矩形
		 * 
		 */		
		public static function getRect(obj:*,space:DisplayObject = null):Rectangle
		{	
			if (!obj)
				return null;
			
			if (obj is Rectangle)
				return (obj as Rectangle).clone();
			
			if (obj is Stage)
			{
				var stageRect:Rectangle = new Rectangle(0,0,(obj as Stage).stageWidth,(obj as Stage).stageHeight);//目标为舞台则取舞台矩形
				if (space)
					return localRectToContent(stageRect,obj as DisplayObject,space);
				else
					return stageRect;
			}
			
			if (obj is DisplayObject)
			{
				if (!space)
					space = (obj as DisplayObject).parent;
				
				if (obj.width == 0 || obj.height == 0)//长框为0则只变换坐标
				{
					var p:Point = localToContent(new Point(),obj,space);
					return new Rectangle(p.x,p.y,0,0);
				}
				
				if ((obj as DisplayObject).scrollRect)//scrollRect有时候不会立即确认属性
					return localRectToContent((obj as DisplayObject).scrollRect,obj,space)
				else
					return obj.getRect(space);
			}
			
			return null;
		}
		
		/**
		 * 获得中心点 
		 * @param obj	显示对象或者矩形
		 * @param space 当前坐标系，默认为父显示对象
		 * @return 中心点坐标
		 * 
		 */		
		public static function center(obj:*,space:DisplayObject=null):Point
		{
			var rect:Rectangle = getRect(obj,space);
			return (rect)?new Point(rect.x + rect.width / 2, rect.y + rect.height / 2):null;
		}
		
		/**
		 * 移动中心点到目标坐标 
		 * @param obj		显示对象或者矩形
		 * @param target	目标坐标
		 * 
		 */		
		public static function moveCenterTo(obj:*,target:Point):void
		{
			var centerP:Point = center(obj,obj.parent);
			obj.x += target.x - centerP.x;
			obj.y += target.y - centerP.y;
		}
		
		/**
		 * 让对象在给定范围内居中 
		 * @param obj		显示对象
		 * @param cotainer	父容器
		 * @param space		默认为父容器
		 * 
		 */		
		public static function centerIn(obj:*,cotainer:*,space:DisplayObjectContainer = null):void
		{
			if (!space && (obj is DisplayObject))
				space = obj.parent;
			
			moveCenterTo(obj,center(cotainer,space));
		}
		
		/**
		 * 由中心点开始创建一个矩形
		 * @param p	中心点
		 * @param w	宽度
		 * @param h	高度
		 * @return 矩形
		 * 
		 */    	
		public static function createCenterRect(p:Point, w:Number, h:Number):Rectangle
		{
			return new Rectangle(p.x - w / 2, p.y - h / 2, w, h);
		}
	}
}